from pyspades.server import block_action
from pyspades.constants import *
from commands import add, admin
import random

ALPHABET = (
    ((1,0), (2,0), (0,1), (3,1), (0,2), (3,2), (0,3), (1,3), (2,3), (3,3), (0,4), (3,4), (0,5), (3,5)),
    ((0,0), (1,0), (2,0), (0,1), (3,1), (0,2), (1,2), (2,2), (0,3), (3,3), (0,4), (3,4), (0,5), (1,5), (2,5)),
    ((1,0), (2,0), (0,1), (3,1), (0,2), (0,3), (0,4), (3,4), (1,5), (2,5)),
    ((0,0), (1,0), (2,0), (0,1), (3,1), (0,2), (3,2), (0,3), (3,3), (0,4), (3,4), (0,5), (1,5), (2,5)),
    ((0,0), (1,0), (2,0), (3,0), (0,1), (0,2), (1,2), (2,2), (0,3), (0,4), (0,5), (1,5), (2,5), (3,5)),
    ((0,0), (1,0), (2,0), (3,0), (0,1), (0,2), (1,2), (2,2), (0,3), (0,4), (0,5)),
    ((1,0), (2,0), (0,1), (3,1), (0,2), (0,3), (2,3), (3,3), (0,4), (3,4), (1,5), (2,5)),
    ((0,0), (3,0), (0,1), (3,1), (0,2), (3,2), (0,3), (1,3), (2,3), (3,3), (0,4), (3,4), (0,5), (3,5)),
    ((0,0), (1,0), (2,0), (1,1), (1,2), (1,3), (1,4), (0,5), (1,5), (2,5)),
    ((0,0), (1,0), (2,0), (3,0), (2,1), (2,2), (2,3), (0,4), (2,4), (1,5)),
    ((0,0), (3,0), (0,1), (2,1), (0,2), (1,2), (0,3), (2,3), (0,4), (3,4), (0,5), (3,5)),
    ((0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (1,5), (2,5)),
    ((0,0), (4,0), (0,1), (1,1), (3,1), (4,1), (0,2), (2,2), (4,2), (0,3), (4,3), (0,4), (4,4), (0,5), (4,5)),
    ((0,0), (4,0), (0,1), (1,1), (4,1), (0,2), (2,2), (4,2), (0,3), (2,3), (4,3), (0,4), (3,4), (4,4), (0,5), (4,5)),
    ((1,0), (2,0), (0,1), (3,1), (0,2), (3,2), (0,3), (3,3), (0,4), (3,4), (1,5), (2,5)),
    ((0,0), (1,0), (2,0), (0,1), (3,1), (0,2), (3,2), (0,3), (1,3), (2,3), (0,4), (0,5)),
    ((1,0), (2,0), (0,1), (3,1), (0,2), (3,2), (0,3), (3,3), (0,4), (2,4), (3,4), (1,5), (2,5), (3,5)),
    ((0,0), (1,0), (2,0), (0,1), (3,1), (0,2), (3,2), (0,3), (1,3), (2,3), (0,4), (3,4), (0,5), (3,5)),
    ((1,0), (2,0), (0,1), (3,1), (1,2), (2,2), (3,3), (0,4), (3,4), (1,5), (2,5)),
    ((0,0), (1,0), (2,0), (3,0), (4,0), (2,1), (2,2), (2,3), (2,4), (2,5)),
    ((0,0), (3,0), (0,1), (3,1), (0,2), (3,2), (0,3), (3,3), (0,4), (3,4), (1,5), (2,5)),
    ((0,0), (3,0), (0,1), (3,1), (0,2), (3,2), (0,3), (3,3), (1,4), (2,4), (1,5), (2,5)),
    ((0,0), (4,0), (0,1), (4,1), (0,2), (4,2), (0,3), (2,3), (4,3), (0,4), (2,4), (4,4), (1,5), (3,5)),
    ((0,0), (4,0), (1,1), (3,1), (2,2), (1,3), (3,3), (0,4), (4,4), (0,5), (4,5)),
    ((0,0), (3,0), (0,1), (3,1), (0,2), (3,2), (1,3), (2,3), (3,3), (3,4), (0,5), (1,5), (2,5)),
    ((0,0), (1,0), (2,0), (3,0), (3,1), (2,2), (1,3), (0,4), (0,5), (1,5), (2,5), (3,5)),
    ((0,5), (0,5)),
    ((0,0), (0,1), (0,2), (0,3), (0,5)),
    ((1,0), (2,0), (0,1), (3,1), (3,2), (1,3), (2,3), (1,5)),
    ((0,0), (0,1)),
    ((1,5), (0,6))
    )
LETTER_LENGTHS = (4,4,4,4,4,4,4,4,3,4,4,3,5,5,4,4,4,4,4,5,4,4,5,5,4,4,1,1,4,2)
@admin
def spell(connection, spellstring = ""):
    connection.spellstring = spellstring
    connection.spelling = True
    return "Place upper left block"
add(spell)
def apply_script(protocol, connection, config):
    
    class AlphabetConnection(connection):
        def on_join(self):
            self.spellstring = ""
            self.spelling = False

        def do_letter(self, letter, x, y, z):
            if letter == 95:
                return 3
            if letter == 46:
                letter = 26 + 65
            if letter == 33:
                letter = 27 + 65
            if letter == 63:
                letter = 28 + 65
            if letter == 39:
                letter = 29 + 65
            if letter == 44:
                letter = 30 + 65
            letter = letter - 65
            if letter > 29 or letter < 0:
                return 0
            map = self.protocol.map
            block_action.value = BUILD_BLOCK
            block_action.player_id = self.player_id
            color = self.color + (255,)
            character = ALPHABET[letter]
            for block in character:
                bx = block[0]
                by = block[1]
                bx, by = x+bx, y+by
                if (bx < 0 or bx >= 512 or by < 0 or by >= 512 or z < 0 or
                    z >= 62):
                    continue
                if map.get_solid(bx, by, z):
                    continue
                block_action.x = bx
                block_action.y = by
                block_action.z = z
                self.protocol.send_contained(block_action, save = True)
                map.set_point(bx, by, z, color, user = False)
            return LETTER_LENGTHS[letter]
        def grenade_exploded(self, grenade):
            randomletter = random.randint(65, 90)
            self.do_letter(randomletter, grenade.position.x, grenade.position.y, grenade.position.z)
        def on_block_build_attempt(self, x, y, z):
            new_x = x
            if self.spelling and self.spellstring != "":
                self.spellstring = self.spellstring.upper()
                for letter in self.spellstring:
                    new_x = 1 + new_x + self.do_letter(ord(letter),new_x,y,z)
                self.spelling = False
                return False
            return connection.on_block_build_attempt(self, x, y, z)
    return protocol, AlphabetConnection